home *** CD-ROM | disk | FTP | other *** search
- /* mosfet.f -- translated by f2c (version of 3 February 1990 3:36:42).
- You must link the resulting object file with the libraries:
- -lF77 -lI77 -lm -lc (in that order)
- */
-
- #include "f2c.h"
-
- /* Common Block Declarations */
-
- struct {
- integer ielmnt, isbckt, nsbckt, iunsat, nunsat, itemps, numtem, isens,
- nsens, ifour, nfour, ifield, icode, idelim, icolum, insize,
- junode, lsbkpt, numbkp, iorder, jmnode, iur, iuc, ilc, ilr,
- numoff, isr, nmoffc, iseq, iseq1, neqn, nodevs, ndiag, iswap,
- iequa, macins, lvnim1, lx0, lvn, lynl, lyu, lyl, lx1, lx2, lx3,
- lx4, lx5, lx6, lx7, ld0, ld1, ltd, imynl, imvn, lcvn, nsnod,
- nsmat, nsval, icnod, icmat, icval, loutpt, lpol, lzer, irswpf,
- irswpr, icswpf, icswpr, irpt, jcpt, irowno, jcolno, nttbr, nttar,
- lvntmp;
- } tabinf_;
-
- #define tabinf_1 tabinf_
-
- struct {
- integer locate[50], jelcnt[50], nunods, ncnods, numnod, nstop, nut, nlt,
- nxtrm, ndist, ntlin, ibr, numvs, numalt, numcyc;
- } cirdat_;
-
- #define cirdat_1 cirdat_
-
- struct {
- doublereal vto, beta, gamma, phi, phib, cox, xnsub, xnfs, xd, xj, xld,
- xlamda, uo, uexp, vbp, utra, vmax, xneff, xl, xw, vbi, von, vdsat,
- qspof, beta0, beta1, cdrain, xqco, xqc, fnarrw, fshort;
- integer lev;
- } mosarg_;
-
- #define mosarg_1 mosarg_
-
- struct {
- doublereal omega, time, delta, delold[7], ag[7], vt, xni, egfet, xmu,
- sfactr;
- integer mode, modedc, icalc, initf, method, iord, maxord, noncon, iterno,
- itemno, nosolv, modac, ipiv, ivmflg, ipostp, iscrch, iofile;
- } status_;
-
- #define status_1 status_
-
- struct {
- doublereal twopi, xlog2, xlog10, root2, rad, boltz, charge, ctok, gmin,
- reltol, abstol, vntol, trtol, chgtol, eps0, epssil, epsox, pivtol,
- pivrel;
- } knstnt_;
-
- #define knstnt_1 knstnt_
-
- struct {
- integer idebug[20];
- } debug_;
-
- #define debug_1 debug_
-
- struct {
- doublereal value[200000];
- } blank_;
-
- #define blank_1 blank_
-
- /* Table of constant values */
-
- static doublereal c_b73 = 0.;
-
- /*< subroutine mosfet >*/
- /* Subroutine */ int mosfet_()
- {
- /* System generated locals */
- integer i_1;
- doublereal d_1, d_2, d_3;
-
- /* Builtin functions */
- double log(), exp();
-
- /* Local variables */
- static doublereal cggb, gcgb, gcgd;
- #define cbdo ((doublereal *)&blank_1 + 6)
- #define cqbd ((doublereal *)&blank_1 + 25)
- #define cgbo ((doublereal *)&blank_1 + 18)
- #define gbdo ((doublereal *)&blank_1 + 10)
- #define cgdo ((doublereal *)&blank_1 + 19)
- #define cqgd ((doublereal *)&blank_1 + 15)
- #define cqgb ((doublereal *)&blank_1 + 17)
- static doublereal cgsb;
- static integer ioff;
- static doublereal cbsb;
- #define cbso ((doublereal *)&blank_1 + 5)
- #define cqbs ((doublereal *)&blank_1 + 27)
- static doublereal gmbs;
- #define vbdo ((doublereal *)&blank_1)
- #define gdso ((doublereal *)&blank_1 + 8)
- #define gbso ((doublereal *)&blank_1 + 11)
- #define cgso ((doublereal *)&blank_1 + 20)
- #define cqgs ((doublereal *)&blank_1 + 13)
- #define vbso ((doublereal *)&blank_1 + 1)
- #define vgso ((doublereal *)&blank_1 + 2)
- #define vdso ((doublereal *)&blank_1 + 3)
- #define vono ((doublereal *)&blank_1 + 21)
- static integer locv, locm;
- static doublereal type;
- static integer loct;
- static doublereal gdpr, gspr, vgdo, evbs, evbd, czbd, czbs, twop, fcpb;
- static integer node1, node2, node3, node4, node5, node6;
- static doublereal fcpb2, czdf2, sarg, gcgs, qdrn, qsrc, xnrm, xrev;
- static integer locy;
- static doublereal czsf2, gcbdb, gcddb, gcbgb, gcgdb, gcdgb;
- #define cbdbo ((doublereal *)&blank_1 + 22)
- static doublereal capbd;
- #define cbgbo ((doublereal *)&blank_1 + 21)
- static doublereal gcggb;
- #define cgdbo ((doublereal *)&blank_1 + 19)
- static doublereal ceqbd, gcbsb;
- #define cggbo ((doublereal *)&blank_1 + 18)
- static doublereal cdhat, cbhat;
- #define cbsbo ((doublereal *)&blank_1 + 23)
- #define cgsbo ((doublereal *)&blank_1 + 20)
- static doublereal cdsat, qgate, qchan, capbs, xfact;
- #define gmbso ((doublereal *)&blank_1 + 9)
- static doublereal ceqgs, ceqgd, cssat, qbulk, ceqgb, gcgsb, vinit, vcrit,
- xmjsw, f1, f2, f3, gcdsb, gcsgb, gcsdb, gcssb, ceqqg, ceqqb,
- ceqqd, cgate, cqdrn, ceqbs, cdreq, czdwf2, vdsat1, ad, cd;
- extern /* Subroutine */ int moseq1_(), moseq2_(), moseq3_(), intgr8_();
- static doublereal czswf2;
- #define qb ((doublereal *)&blank_1 + 12)
- static doublereal as;
- #define qd ((doublereal *)&blank_1 + 16)
- static doublereal pd;
- static integer icheck;
- #define qg ((doublereal *)&blank_1 + 14)
- static doublereal gm, delvbd;
- #define nodplc ((integer *)&blank_1)
- #define cvalue ((complex *)&blank_1)
- #define vdsato ((doublereal *)&blank_1 + 22)
- static doublereal devmod, ps, covlgs, covlgd, covlgb;
- static integer ibypas;
- static doublereal delvbs, delvgs, delvds, delvgd;
- #define cdo ((doublereal *)&blank_1 + 4)
- #define cqb ((doublereal *)&blank_1 + 13)
- #define cqd ((doublereal *)&blank_1 + 17)
- #define cqg ((doublereal *)&blank_1 + 15)
- #define qbd ((doublereal *)&blank_1 + 24)
- #define qgd ((doublereal *)&blank_1 + 14)
- #define qgb ((doublereal *)&blank_1 + 16)
- static integer loc;
- #define gmo ((doublereal *)&blank_1 + 7)
- #define qbs ((doublereal *)&blank_1 + 26)
- #define qgs ((doublereal *)&blank_1 + 12)
- static doublereal vds, vgs, vbs, vbd, vgd, tol, vgb, cbs, cbd, gds, gbd,
- gbs, cgb, cgd, cgs;
- extern /* Subroutine */ int fetlim_(), limvds_(), pnjlim_();
- static doublereal czbdsw, czbssw, xmj, arg, sargsw, vgb1, geq, vgd1, ceq;
- extern /* Subroutine */ int cmeyer_();
- static doublereal cgs1, cgd1, cgb1;
- extern /* Subroutine */ int moscap_();
- static doublereal cqbulk, vgs1, von1, cbdb, cbgb, cgdb;
-
- /*< implicit double precision (a-h,o-z) >*/
-
- /* this routine processes mosfets for dc and transient analyses. */
-
- /* spice version 2g.6 sccsid=tabinf 3/15/83 */
- /*< common /tabinf/ ielmnt,isbckt,nsbckt,iunsat,nunsat,itemps,numtem, >*/
- /*< 1 isens,nsens,ifour,nfour,ifield,icode,idelim,icolum,insize, >*/
- /*< 2 junode,lsbkpt,numbkp,iorder,jmnode,iur,iuc,ilc,ilr,numoff,isr, >*/
- /*< 3 nmoffc,iseq,iseq1,neqn,nodevs,ndiag,iswap,iequa,macins,lvnim1, >*/
- /*< 4 lx0,lvn,lynl,lyu,lyl,lx1,lx2,lx3,lx4,lx5,lx6,lx7,ld0,ld1,ltd, >*/
- /*< 5 imynl,imvn,lcvn,nsnod,nsmat,nsval,icnod,icmat,icval, >*/
- /*< 6 loutpt,lpol,lzer,irswpf,irswpr,icswpf,icswpr,irpt,jcpt, >*/
- /*< 7 irowno,jcolno,nttbr,nttar,lvntmp >*/
- /* spice version 2g.6 sccsid=cirdat 3/15/83 */
- /*< common /cirdat/ locate(50),jelcnt(50),nunods,ncnods,numnod,nstop, >*/
- /*< 1 nut,nlt,nxtrm,ndist,ntlin,ibr,numvs,numalt,numcyc >*/
- /* spice version 2g.6 sccsid=mosarg 3/15/83 */
- /*< common /mosarg/ vto,beta,gamma,phi,phib,cox,xnsub,xnfs,xd,xj,xld, >*/
- /*< 1 xlamda,uo,uexp,vbp,utra,vmax,xneff,xl,xw,vbi,von,vdsat,qspof, >*/
- /*< 2 beta0,beta1,cdrain,xqco,xqc,fnarrw,fshort,lev >*/
- /* spice version 2g.6 sccsid=status 3/15/83 */
- /*< common /status/ omega,time,delta,delold(7),ag(7),vt,xni,egfet, >*/
- /*< 1 xmu,sfactr,mode,modedc,icalc,initf,method,iord,maxord,noncon, >*/
- /*< 2 iterno,itemno,nosolv,modac,ipiv,ivmflg,ipostp,iscrch,iofile >*/
- /* spice version 2g.6 sccsid=knstnt 3/15/83 */
- /*< common /knstnt/ twopi,xlog2,xlog10,root2,rad,boltz,charge,ctok, >*/
- /*< 1 gmin,reltol,abstol,vntol,trtol,chgtol,eps0,epssil,epsox, >*/
- /*< 2 pivtol,pivrel >*/
- /* spice version 2g.6 sccsid=debug 3/15/83 */
- /*< common/debug/ idebug(20) >*/
- /* spice version 2g.6 sccsid=blank 3/15/83 */
- /*< common /blank/ value(200000) >*/
- /*< integer nodplc(64) >*/
- /*< complex cvalue(32) >*/
- /*< equivalence (value(1),nodplc(1),cvalue(1)) >*/
-
-
- /*< dimension vbdo(1),vbso(1),vgso(1),vdso(1),cdo(1),cbso(1),cbdo(1), >*/
- /*< 1 gmo(1),gdso(1),gmbso(1),gbdo(1),gbso(1), >*/
- /*< 2 qb(1),cqb(1),qg(1),cqg(1),qd(1),cqd(1), >*/
- /*< 3 cggbo(1),cgdbo(1),cgsbo(1),cbgbo(1),cbdbo(1),cbsbo(1), >*/
- /*< 4 cgbo(1),cgdo(1),cgso(1),vono(1),vdsato(1) >*/
- /*< dimension qbd(1),cqbd(1),qbs(1),cqbs(1), >*/
- /*< 1 qgs(1),cqgs(1),qgd(1),cqgd(1),qgb(1),cqgb(1) >*/
- /*< equivalence (vbdo (1),value( 1)),(vbso (1),value( 2)), >*/
- /*< 1 (vgso (1),value( 3)),(vdso (1),value( 4)), >*/
- /*< 2 (cdo (1),value( 5)),(cbso (1),value( 6)), >*/
- /*< 3 (cbdo (1),value( 7)),(gmo (1),value( 8)), >*/
- /*< 4 (gdso (1),value( 9)),(gmbso(1),value(10)), >*/
- /*< 5 (gbdo (1),value(11)),(gbso (1),value(12)), >*/
- /*< 6 (qb (1),qgs ( 1), value(13)), >*/
- /*< 7 (cqb (1),cqgs ( 1), value(14)), >*/
- /*< 8 (qg (1),qgd ( 1), value(15)), >*/
- /*< 9 (cqg (1),cqgd ( 1), value(16)), >*/
- /*< a (qd (1),qgb ( 1), value(17)), >*/
- /*< b (cqd (1),cqgb ( 1), value(18)), >*/
- /*< c (cggbo(1),cgbo (1), value(19)), >*/
- /*< d (cgdbo(1),cgdo (1), value(20)), >*/
- /*< e (cgsbo(1),cgso (1), value(21)), >*/
- /*< f (cbgbo(1),vono (1), value(22)), >*/
- /*< g (cbdbo(1),vdsato(1), value(23)), >*/
- /*< h (cbsbo(1), value(24)) >*/
- /*< equivalence (qbd (1),value(25)),(cqbd (1),value(26)), >*/
- /*< 1 (qbs (1),value(27)),(cqbs (1),value(28)) >*/
-
-
- /*< loc=locate(14) >*/
- loc = cirdat_1.locate[13];
- /*< 10 if ((loc.eq.0).or.(nodplc(loc+33).ne.0)) return >*/
- L10:
- if (loc == 0 || nodplc[loc + 32] != 0) {
- return 0;
- }
- /*< locv=nodplc(loc+1) >*/
- locv = nodplc[loc];
- /*< node1=nodplc(loc+2) >*/
- node1 = nodplc[loc + 1];
- /*< node2=nodplc(loc+3) >*/
- node2 = nodplc[loc + 2];
- /*< node3=nodplc(loc+4) >*/
- node3 = nodplc[loc + 3];
- /*< node4=nodplc(loc+5) >*/
- node4 = nodplc[loc + 4];
- /*< node5=nodplc(loc+6) >*/
- node5 = nodplc[loc + 5];
- /*< node6=nodplc(loc+7) >*/
- node6 = nodplc[loc + 6];
- /*< locm=nodplc(loc+8) >*/
- locm = nodplc[loc + 7];
- /*< ioff=nodplc(loc+9) >*/
- ioff = nodplc[loc + 8];
- /*< type=nodplc(locm+2) >*/
- type = (doublereal) nodplc[locm + 1];
- /*< locm=nodplc(locm+1) >*/
- locm = nodplc[locm];
- /*< loct=nodplc(loc+26) >*/
- loct = nodplc[loc + 25];
-
- /* dc model parameters */
-
- /*< xj=value(locm+27) >*/
- mosarg_1.xj = blank_1.value[locm + 26];
- /*< xld=value(locm+28) >*/
- mosarg_1.xld = blank_1.value[locm + 27];
- /*< xl=value(locv+1)-2.0d0*xld >*/
- mosarg_1.xl = blank_1.value[locv] - mosarg_1.xld * 2.;
- /*< xw=value(locv+2) >*/
- mosarg_1.xw = blank_1.value[locv + 1];
- /*< devmod=value(locv+8) >*/
- devmod = blank_1.value[locv + 7];
- /*< vto=type*value(locm+2) >*/
- mosarg_1.vto = type * blank_1.value[locm + 1];
- /*< vdsat=type*value(locv+10) >*/
- mosarg_1.vdsat = type * blank_1.value[locv + 9];
- /*< vinit=value(locm+43) >*/
- vinit = blank_1.value[locm + 42];
- /*< ad=value(locv+3) >*/
- ad = blank_1.value[locv + 2];
- /*< as=value(locv+4) >*/
- as = blank_1.value[locv + 3];
- /*< pd=value(locv+11) >*/
- pd = blank_1.value[locv + 10];
- /*< ps=value(locv+12) >*/
- ps = blank_1.value[locv + 11];
- /*< if (value(locm+21).eq.0.0d0. >*/
- /*< 1 or.ad.eq.0.0d0.or.as.eq.0.0d0) go to 12 >*/
- if (blank_1.value[locm + 20] == 0. || ad == 0. || as == 0.) {
- goto L12;
- }
- /*< cdsat=value(locm+21)*ad >*/
- cdsat = blank_1.value[locm + 20] * ad;
- /*< cssat=value(locm+21)*as >*/
- cssat = blank_1.value[locm + 20] * as;
- /*< go to 15 >*/
- goto L15;
- /*< 12 cdsat=value(locm+11) >*/
- L12:
- cdsat = blank_1.value[locm + 10];
- /*< cssat=value(locm+11) >*/
- cssat = blank_1.value[locm + 10];
- /*< 15 if ((value(locm+7).le.0.0d0).and. >*/
- /*< 1 (value(locm+8).le.0.0d0)) go to 17 >*/
- L15:
- if (blank_1.value[locm + 6] <= 0. && blank_1.value[locm + 7] <= 0.) {
- goto L17;
- }
- /*< gdpr=value(locm+7) >*/
- gdpr = blank_1.value[locm + 6];
- /*< gspr=value(locm+8) >*/
- gspr = blank_1.value[locm + 7];
- /*< go to 19 >*/
- goto L19;
- /*< 17 gdpr=value(locm+16)/value(locv+13) >*/
- L17:
- gdpr = blank_1.value[locm + 15] / blank_1.value[locv + 12];
- /*< gspr=value(locm+16)/value(locv+14) >*/
- gspr = blank_1.value[locm + 15] / blank_1.value[locv + 13];
- /*< 19 covlgs=value(locm+13)*xw >*/
- L19:
- covlgs = blank_1.value[locm + 12] * mosarg_1.xw;
- /*< covlgd=value(locm+14)*xw >*/
- covlgd = blank_1.value[locm + 13] * mosarg_1.xw;
- /*< covlgb=value(locm+15)*xl >*/
- covlgb = blank_1.value[locm + 14] * mosarg_1.xl;
- /*< lev=value(locm+1) >*/
- mosarg_1.lev = (integer) blank_1.value[locm];
-
- /* mos1, mos2 and mos3 model parameters */
-
- /*< beta=value(locm+3)*xw/xl >*/
- mosarg_1.beta = blank_1.value[locm + 2] * mosarg_1.xw / mosarg_1.xl;
- /*< gamma=value(locm+4) >*/
- mosarg_1.gamma = blank_1.value[locm + 3];
- /*< phi=value(locm+5) >*/
- mosarg_1.phi = blank_1.value[locm + 4];
- /*< xlamda=value(locm+6) >*/
- mosarg_1.xlamda = blank_1.value[locm + 5];
- /*< phib=value(locm+12) >*/
- mosarg_1.phib = blank_1.value[locm + 11];
- /*< cox=value(locm+22)*xw*xl >*/
- mosarg_1.cox = blank_1.value[locm + 21] * mosarg_1.xw * mosarg_1.xl;
- /*< xnsub=value(locm+23) >*/
- mosarg_1.xnsub = blank_1.value[locm + 22];
- /*< xnfs=value(locm+25) >*/
- mosarg_1.xnfs = blank_1.value[locm + 24];
- /*< uo=value(locm+29) >*/
- mosarg_1.uo = blank_1.value[locm + 28];
- /*< vbp=value(locm+30) >*/
- mosarg_1.vbp = blank_1.value[locm + 29];
- /*< uexp=value(locm+31) >*/
- mosarg_1.uexp = blank_1.value[locm + 30];
- /*< utra=value(locm+32) >*/
- mosarg_1.utra = blank_1.value[locm + 31];
- /*< vbi=type*value(locm+44) >*/
- mosarg_1.vbi = type * blank_1.value[locm + 43];
- /*< xd=value(locm+45) >*/
- mosarg_1.xd = blank_1.value[locm + 44];
- /*< vmax=value(locm+33) >*/
- mosarg_1.vmax = blank_1.value[locm + 32];
- /*< xneff=value(locm+34) >*/
- mosarg_1.xneff = blank_1.value[locm + 33];
- /*< xqco=value(locm+35) >*/
- mosarg_1.xqco = blank_1.value[locm + 34];
- /*< fnarrw=value(locm+39) >*/
- mosarg_1.fnarrw = blank_1.value[locm + 38];
- /*< if (lev.eq.3) fnarrw=fnarrw/xw >*/
- if (mosarg_1.lev == 3) {
- mosarg_1.fnarrw /= mosarg_1.xw;
- }
-
- /* initialization */
-
- /*< icheck=1 >*/
- icheck = 1;
- /*< ibypas=0 >*/
- ibypas = 0;
- /*< go to (100,20,30,50,60,70), initf >*/
- switch (status_1.initf) {
- case 1: goto L100;
- case 2: goto L20;
- case 3: goto L30;
- case 4: goto L50;
- case 5: goto L60;
- case 6: goto L70;
- }
- /*< 20 if (ioff.ne.0) go to 40 >*/
- L20:
- if (ioff != 0) {
- goto L40;
- }
- /*< vds=type*value(locv+5) >*/
- vds = type * blank_1.value[locv + 4];
- /*< vgs=type*value(locv+6) >*/
- vgs = type * blank_1.value[locv + 5];
- /*< vbs=type*value(locv+7) >*/
- vbs = type * blank_1.value[locv + 6];
- /*< if (vds.ne.0.0d0) go to 300 >*/
- if (vds != 0.) {
- goto L300;
- }
- /*< if (vgs.ne.0.0d0) go to 300 >*/
- if (vgs != 0.) {
- goto L300;
- }
- /*< if (vbs.ne.0.0d0) go to 300 >*/
- if (vbs != 0.) {
- goto L300;
- }
- /*< if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 300 >*/
- if (status_1.mode == 1 && status_1.modedc == 2 && status_1.nosolv != 0) {
- goto L300;
- }
- /*< vbs=vinit >*/
- vbs = vinit;
- /*< vgs=vto >*/
- vgs = mosarg_1.vto;
- /*< vds=0.0d0 >*/
- vds = 0.;
- /*< go to 300 >*/
- goto L300;
- /*< 30 if (ioff.eq.0) go to 100 >*/
- L30:
- if (ioff == 0) {
- goto L100;
- }
- /*< 40 vbs=0.0d0 >*/
- L40:
- vbs = 0.;
- /*< vgs=0.0d0 >*/
- vgs = 0.;
- /*< vds=0.0d0 >*/
- vds = 0.;
- /*< go to 300 >*/
- goto L300;
- /*< 50 vbs=vbso(lx0+loct) >*/
- L50:
- vbs = vbso[tabinf_1.lx0 + loct - 1];
- /*< vgs=vgso(lx0+loct) >*/
- vgs = vgso[tabinf_1.lx0 + loct - 1];
- /*< vds=vdso(lx0+loct) >*/
- vds = vdso[tabinf_1.lx0 + loct - 1];
- /*< go to 300 >*/
- goto L300;
- /*< 60 vbs=vbso(lx1+loct) >*/
- L60:
- vbs = vbso[tabinf_1.lx1 + loct - 1];
- /*< vgs=vgso(lx1+loct) >*/
- vgs = vgso[tabinf_1.lx1 + loct - 1];
- /*< vds=vdso(lx1+loct) >*/
- vds = vdso[tabinf_1.lx1 + loct - 1];
- /*< go to 300 >*/
- goto L300;
- /*< 70 xfact=delta/delold(2) >*/
- L70:
- xfact = status_1.delta / status_1.delold[1];
- /*< vbso(lx0+loct)=vbso(lx1+loct) >*/
- vbso[tabinf_1.lx0 + loct - 1] = vbso[tabinf_1.lx1 + loct - 1];
- /*< vbs=(1.0d0+xfact)*vbso(lx1+loct)-xfact*vbso(lx2+loct) >*/
- vbs = (xfact + 1.) * vbso[tabinf_1.lx1 + loct - 1] - xfact * vbso[
- tabinf_1.lx2 + loct - 1];
- /*< vgso(lx0+loct)=vgso(lx1+loct) >*/
- vgso[tabinf_1.lx0 + loct - 1] = vgso[tabinf_1.lx1 + loct - 1];
- /*< vgs=(1.0d0+xfact)*vgso(lx1+loct)-xfact*vgso(lx2+loct) >*/
- vgs = (xfact + 1.) * vgso[tabinf_1.lx1 + loct - 1] - xfact * vgso[
- tabinf_1.lx2 + loct - 1];
- /*< vdso(lx0+loct)=vdso(lx1+loct) >*/
- vdso[tabinf_1.lx0 + loct - 1] = vdso[tabinf_1.lx1 + loct - 1];
- /*< vds=(1.0d0+xfact)*vdso(lx1+loct)-xfact*vdso(lx2+loct) >*/
- vds = (xfact + 1.) * vdso[tabinf_1.lx1 + loct - 1] - xfact * vdso[
- tabinf_1.lx2 + loct - 1];
- /*< vbdo(lx0+loct)=vbso(lx0+loct)-vdso(lx0+loct) >*/
- vbdo[tabinf_1.lx0 + loct - 1] = vbso[tabinf_1.lx0 + loct - 1] - vdso[
- tabinf_1.lx0 + loct - 1];
- /*< cdo(lx0+loct)=cdo(lx1+loct) >*/
- cdo[tabinf_1.lx0 + loct - 1] = cdo[tabinf_1.lx1 + loct - 1];
- /*< cbso(lx0+loct)=cbso(lx1+loct) >*/
- cbso[tabinf_1.lx0 + loct - 1] = cbso[tabinf_1.lx1 + loct - 1];
- /*< cbdo(lx0+loct)=cbdo(lx1+loct) >*/
- cbdo[tabinf_1.lx0 + loct - 1] = cbdo[tabinf_1.lx1 + loct - 1];
- /*< gmo(lx0+loct)=gmo(lx1+loct) >*/
- gmo[tabinf_1.lx0 + loct - 1] = gmo[tabinf_1.lx1 + loct - 1];
- /*< gdso(lx0+loct)=gdso(lx1+loct) >*/
- gdso[tabinf_1.lx0 + loct - 1] = gdso[tabinf_1.lx1 + loct - 1];
- /*< gmbso(lx0+loct)=gmbso(lx1+loct) >*/
- gmbso[tabinf_1.lx0 + loct - 1] = gmbso[tabinf_1.lx1 + loct - 1];
- /*< gbdo(lx0+loct)=gbdo(lx1+loct) >*/
- gbdo[tabinf_1.lx0 + loct - 1] = gbdo[tabinf_1.lx1 + loct - 1];
- /*< gbso(lx0+loct)=gbso(lx1+loct) >*/
- gbso[tabinf_1.lx0 + loct - 1] = gbso[tabinf_1.lx1 + loct - 1];
- /*< cggbo(lx0+loct)=cggbo(lx1+loct) >*/
- cggbo[tabinf_1.lx0 + loct - 1] = cggbo[tabinf_1.lx1 + loct - 1];
- /*< cgdbo(lx0+loct)=cgdbo(lx1+loct) >*/
- cgdbo[tabinf_1.lx0 + loct - 1] = cgdbo[tabinf_1.lx1 + loct - 1];
- /*< cgsbo(lx0+loct)=cgsbo(lx1+loct) >*/
- cgsbo[tabinf_1.lx0 + loct - 1] = cgsbo[tabinf_1.lx1 + loct - 1];
- /*< cbgbo(lx0+loct)=cbgbo(lx1+loct) >*/
- cbgbo[tabinf_1.lx0 + loct - 1] = cbgbo[tabinf_1.lx1 + loct - 1];
- /*< cbdbo(lx0+loct)=cbdbo(lx1+loct) >*/
- cbdbo[tabinf_1.lx0 + loct - 1] = cbdbo[tabinf_1.lx1 + loct - 1];
- /*< cbsbo(lx0+loct)=cbsbo(lx1+loct) >*/
- cbsbo[tabinf_1.lx0 + loct - 1] = cbsbo[tabinf_1.lx1 + loct - 1];
- /*< go to 110 >*/
- goto L110;
-
- /* compute new nonlinear branch voltages */
-
- /*< 100 vbs=type*(value(lvnim1+node4)-value(lvnim1+node6)) >*/
- L100:
- vbs = type * (blank_1.value[tabinf_1.lvnim1 + node4 - 1] - blank_1.value[
- tabinf_1.lvnim1 + node6 - 1]);
- /*< vgs=type*(value(lvnim1+node2)-value(lvnim1+node6)) >*/
- vgs = type * (blank_1.value[tabinf_1.lvnim1 + node2 - 1] - blank_1.value[
- tabinf_1.lvnim1 + node6 - 1]);
- /*< vds=type*(value(lvnim1+node5)-value(lvnim1+node6)) >*/
- vds = type * (blank_1.value[tabinf_1.lvnim1 + node5 - 1] - blank_1.value[
- tabinf_1.lvnim1 + node6 - 1]);
- /*< 110 vbd=vbs-vds >*/
- L110:
- vbd = vbs - vds;
- /*< vgd=vgs-vds >*/
- vgd = vgs - vds;
- /*< vgdo=vgso(lx0+loct)-vdso(lx0+loct) >*/
- vgdo = vgso[tabinf_1.lx0 + loct - 1] - vdso[tabinf_1.lx0 + loct - 1];
- /*< delvbs=vbs-vbso(lx0+loct) >*/
- delvbs = vbs - vbso[tabinf_1.lx0 + loct - 1];
- /*< delvbd=vbd-vbdo(lx0+loct) >*/
- delvbd = vbd - vbdo[tabinf_1.lx0 + loct - 1];
- /*< delvgs=vgs-vgso(lx0+loct) >*/
- delvgs = vgs - vgso[tabinf_1.lx0 + loct - 1];
- /*< delvds=vds-vdso(lx0+loct) >*/
- delvds = vds - vdso[tabinf_1.lx0 + loct - 1];
- /*< delvgd=vgd-vgdo >*/
- delvgd = vgd - vgdo;
- /*< if (devmod.lt.0.0d0) go to 120 >*/
- if (devmod < 0.) {
- goto L120;
- }
- /*< cdhat=cdo(lx0+loct)-gbdo(lx0+loct)*delvbd+gmbso(lx0+loct)*delvbs >*/
- /*< 1 +gmo(lx0+loct)*delvgs+gdso(lx0+loct)*delvds >*/
- cdhat = cdo[tabinf_1.lx0 + loct - 1] - gbdo[tabinf_1.lx0 + loct - 1] *
- delvbd + gmbso[tabinf_1.lx0 + loct - 1] * delvbs + gmo[
- tabinf_1.lx0 + loct - 1] * delvgs + gdso[tabinf_1.lx0 + loct - 1]
- * delvds;
- /*< go to 130 >*/
- goto L130;
- /*< 120 cdhat=cdo(lx0+loct)-(gbdo(lx0+loct)-gmbso(lx0+loct))*delvbd >*/
- /*< 1 -gmo(lx0+loct)*delvgd+gdso(lx0+loct)*delvds >*/
- L120:
- cdhat = cdo[tabinf_1.lx0 + loct - 1] - (gbdo[tabinf_1.lx0 + loct - 1] -
- gmbso[tabinf_1.lx0 + loct - 1]) * delvbd - gmo[tabinf_1.lx0 +
- loct - 1] * delvgd + gdso[tabinf_1.lx0 + loct - 1] * delvds;
- /*< 130 cbhat=cbso(lx0+loct)+cbdo(lx0+loct)+gbdo(lx0+loct)*delvbd >*/
- /*< 1 +gbso(lx0+loct)*delvbs >*/
- L130:
- cbhat = cbso[tabinf_1.lx0 + loct - 1] + cbdo[tabinf_1.lx0 + loct - 1] +
- gbdo[tabinf_1.lx0 + loct - 1] * delvbd + gbso[tabinf_1.lx0 + loct
- - 1] * delvbs;
-
- /* bypass if solution has not changed */
-
- /*< if (initf.eq.6) go to 200 >*/
- if (status_1.initf == 6) {
- goto L200;
- }
- /*< tol=reltol*dmax1(dabs(vbs),dabs(vbso(lx0+loct)))+vntol >*/
- /* Computing MAX */
- d_2 = abs(vbs), d_3 = (d_1 = vbso[tabinf_1.lx0 + loct - 1], abs(d_1));
- tol = knstnt_1.reltol * max(d_3,d_2) + knstnt_1.vntol;
- /*< if (dabs(delvbs).ge.tol) go to 200 >*/
- if (abs(delvbs) >= tol) {
- goto L200;
- }
- /*< tol=reltol*dmax1(dabs(vbd),dabs(vbdo(lx0+loct)))+vntol >*/
- /* Computing MAX */
- d_2 = abs(vbd), d_3 = (d_1 = vbdo[tabinf_1.lx0 + loct - 1], abs(d_1));
- tol = knstnt_1.reltol * max(d_3,d_2) + knstnt_1.vntol;
- /*< if (dabs(delvbd).ge.tol) go to 200 >*/
- if (abs(delvbd) >= tol) {
- goto L200;
- }
- /*< tol=reltol*dmax1(dabs(vgs),dabs(vgso(lx0+loct)))+vntol >*/
- /* Computing MAX */
- d_2 = abs(vgs), d_3 = (d_1 = vgso[tabinf_1.lx0 + loct - 1], abs(d_1));
- tol = knstnt_1.reltol * max(d_3,d_2) + knstnt_1.vntol;
- /*< if (dabs(delvgs).ge.tol) go to 200 >*/
- if (abs(delvgs) >= tol) {
- goto L200;
- }
- /*< tol=reltol*dmax1(dabs(vds),dabs(vdso(lx0+loct)))+vntol >*/
- /* Computing MAX */
- d_2 = abs(vds), d_3 = (d_1 = vdso[tabinf_1.lx0 + loct - 1], abs(d_1));
- tol = knstnt_1.reltol * max(d_3,d_2) + knstnt_1.vntol;
- /*< if (dabs(delvds).ge.tol) go to 200 >*/
- if (abs(delvds) >= tol) {
- goto L200;
- }
- /*< tol=reltol*dmax1(dabs(cdhat),dabs(cdo(lx0+loct)))+abstol >*/
- /* Computing MAX */
- d_2 = abs(cdhat), d_3 = (d_1 = cdo[tabinf_1.lx0 + loct - 1], abs(d_1));
- tol = knstnt_1.reltol * max(d_3,d_2) + knstnt_1.abstol;
- /*< if (dabs(cdhat-cdo(lx0+loct)).ge.tol) go to 200 >*/
- if ((d_1 = cdhat - cdo[tabinf_1.lx0 + loct - 1], abs(d_1)) >= tol) {
- goto L200;
- }
- /*< tol=reltol*dmax1(dabs(cbhat),dabs(cbso(lx0+loct)+cbdo(lx0+loct))) >*/
- /*< 1 +abstol >*/
- /* Computing MAX */
- d_2 = abs(cbhat), d_3 = (d_1 = cbso[tabinf_1.lx0 + loct - 1] + cbdo[
- tabinf_1.lx0 + loct - 1], abs(d_1));
- tol = knstnt_1.reltol * max(d_3,d_2) + knstnt_1.abstol;
- /*< if (dabs(cbhat-(cbso(lx0+loct)+cbdo(lx0+loct))).ge.tol) go to 200 >*/
- if ((d_1 = cbhat - (cbso[tabinf_1.lx0 + loct - 1] + cbdo[tabinf_1.lx0 +
- loct - 1]), abs(d_1)) >= tol) {
- goto L200;
- }
- /*< vbs=vbso(lx0+loct) >*/
- vbs = vbso[tabinf_1.lx0 + loct - 1];
- /*< vbd=vbdo(lx0+loct) >*/
- vbd = vbdo[tabinf_1.lx0 + loct - 1];
- /*< vgs=vgso(lx0+loct) >*/
- vgs = vgso[tabinf_1.lx0 + loct - 1];
- /*< vds=vdso(lx0+loct) >*/
- vds = vdso[tabinf_1.lx0 + loct - 1];
- /*< vgd=vgs-vds >*/
- vgd = vgs - vds;
- /*< vgb=vgs-vbs >*/
- vgb = vgs - vbs;
- /*< cd=cdo(lx0+loct) >*/
- cd = cdo[tabinf_1.lx0 + loct - 1];
- /*< cbs=cbso(lx0+loct) >*/
- cbs = cbso[tabinf_1.lx0 + loct - 1];
- /*< cbd=cbdo(lx0+loct) >*/
- cbd = cbdo[tabinf_1.lx0 + loct - 1];
- /*< cdrain=devmod*(cd+cbd) >*/
- mosarg_1.cdrain = devmod * (cd + cbd);
- /*< gm=gmo(lx0+loct) >*/
- gm = gmo[tabinf_1.lx0 + loct - 1];
- /*< gds=gdso(lx0+loct) >*/
- gds = gdso[tabinf_1.lx0 + loct - 1];
- /*< gmbs=gmbso(lx0+loct) >*/
- gmbs = gmbso[tabinf_1.lx0 + loct - 1];
- /*< gbd=gbdo(lx0+loct) >*/
- gbd = gbdo[tabinf_1.lx0 + loct - 1];
- /*< gbs=gbso(lx0+loct) >*/
- gbs = gbso[tabinf_1.lx0 + loct - 1];
- /*< devmod=value(locv+8) >*/
- devmod = blank_1.value[locv + 7];
- /*< if (mode.ne.1) go to 135 >*/
- if (status_1.mode != 1) {
- goto L135;
- }
- /*< if ((modedc.eq.2).and.(nosolv.ne.0)) go to 135 >*/
- if (status_1.modedc == 2 && status_1.nosolv != 0) {
- goto L135;
- }
- /*< if (xqco.gt.0.5d0) go to 742 >*/
- if (mosarg_1.xqco > .5) {
- goto L742;
- }
- /*< go to 850 >*/
- goto L850;
- /*< 135 if (xqco.le.0.5d0) go to 140 >*/
- L135:
- if (mosarg_1.xqco <= .5) {
- goto L140;
- }
- /*< cgb=cgbo(lx0+loct) >*/
- cgb = cgbo[tabinf_1.lx0 + loct - 1];
- /*< cgd=cgdo(lx0+loct) >*/
- cgd = cgdo[tabinf_1.lx0 + loct - 1];
- /*< cgs=cgso(lx0+loct) >*/
- cgs = cgso[tabinf_1.lx0 + loct - 1];
- /*< vgs1=vgso(lx1+loct) >*/
- vgs1 = vgso[tabinf_1.lx1 + loct - 1];
- /*< vgb1=vgs1-vbso(lx1+loct) >*/
- vgb1 = vgs1 - vbso[tabinf_1.lx1 + loct - 1];
- /*< vgd1=vgs1-vdso(lx1+loct) >*/
- vgd1 = vgs1 - vdso[tabinf_1.lx1 + loct - 1];
- /*< go to 735 >*/
- goto L735;
- /*< 140 cggb=cggbo(lx0+loct) >*/
- L140:
- cggb = cggbo[tabinf_1.lx0 + loct - 1];
- /*< cgdb=cgdbo(lx0+loct) >*/
- cgdb = cgdbo[tabinf_1.lx0 + loct - 1];
- /*< cgsb=cgsbo(lx0+loct) >*/
- cgsb = cgsbo[tabinf_1.lx0 + loct - 1];
- /*< cbgb=cbgbo(lx0+loct) >*/
- cbgb = cbgbo[tabinf_1.lx0 + loct - 1];
- /*< cbdb=cbdbo(lx0+loct) >*/
- cbdb = cbdbo[tabinf_1.lx0 + loct - 1];
- /*< cbsb=cbsbo(lx0+loct) >*/
- cbsb = cbsbo[tabinf_1.lx0 + loct - 1];
- /*< xqc=value(locv+15) >*/
- mosarg_1.xqc = blank_1.value[locv + 14];
- /*< ibypas=1 >*/
- ibypas = 1;
- /*< go to 755 >*/
- goto L755;
-
- /* limit nonlinear branch voltages */
-
- /*< 200 von=type*value(locv+9) >*/
- L200:
- mosarg_1.von = type * blank_1.value[locv + 8];
- /*< if (vdso(lx0+loct).lt.0.0d0) go to 205 >*/
- if (vdso[tabinf_1.lx0 + loct - 1] < 0.) {
- goto L205;
- }
- /*< call fetlim(vgs,vgso(lx0+loct),von) >*/
- fetlim_(&vgs, &vgso[tabinf_1.lx0 + loct - 1], &mosarg_1.von);
- /*< vds=vgs-vgd >*/
- vds = vgs - vgd;
- /*< call limvds(vds,vdso(lx0+loct)) >*/
- limvds_(&vds, &vdso[tabinf_1.lx0 + loct - 1]);
- /*< vgd=vgs-vds >*/
- vgd = vgs - vds;
- /*< go to 210 >*/
- goto L210;
- /*< 205 call fetlim(vgd,vgdo,von) >*/
- L205:
- fetlim_(&vgd, &vgdo, &mosarg_1.von);
- /*< vds=vgs-vgd >*/
- vds = vgs - vgd;
- /*< call limvds(-vds,-vdso(lx0+loct)) >*/
- d_1 = -vds;
- d_2 = -vdso[tabinf_1.lx0 + loct - 1];
- limvds_(&d_1, &d_2);
- /*< vgs=vgd+vds >*/
- vgs = vgd + vds;
- /*< 210 if (vds.lt.0.0d0) go to 220 >*/
- L210:
- if (vds < 0.) {
- goto L220;
- }
- /*< vcrit=vt*dlog(vt/(root2*cssat)) >*/
- vcrit = status_1.vt * log(status_1.vt / (knstnt_1.root2 * cssat));
- /*< call pnjlim(vbs,vbso(lx0+loct),vt,vcrit,icheck) >*/
- pnjlim_(&vbs, &vbso[tabinf_1.lx0 + loct - 1], &status_1.vt, &vcrit, &
- icheck);
- /*< vbd=vbs-vds >*/
- vbd = vbs - vds;
- /*< go to 300 >*/
- goto L300;
- /*< 220 vcrit=vt*dlog(vt/(root2*cdsat)) >*/
- L220:
- vcrit = status_1.vt * log(status_1.vt / (knstnt_1.root2 * cdsat));
- /*< call pnjlim(vbd,vbdo(lx0+loct),vt,vcrit,icheck) >*/
- pnjlim_(&vbd, &vbdo[tabinf_1.lx0 + loct - 1], &status_1.vt, &vcrit, &
- icheck);
- /*< vbs=vbd+vds >*/
- vbs = vbd + vds;
-
- /* determine dc current and derivatives */
-
- /*< 300 vbd=vbs-vds >*/
- L300:
- vbd = vbs - vds;
- /*< vgd=vgs-vds >*/
- vgd = vgs - vds;
- /*< vgb=vgs-vbs >*/
- vgb = vgs - vbs;
- /*< if (vbs.gt.0.0d0) go to 310 >*/
- if (vbs > 0.) {
- goto L310;
- }
- /*< gbs=cssat/vt >*/
- gbs = cssat / status_1.vt;
- /*< cbs=gbs*vbs >*/
- cbs = gbs * vbs;
- /*< gbs=gbs+gmin >*/
- gbs += knstnt_1.gmin;
- /*< go to 320 >*/
- goto L320;
- /*< 310 evbs=dexp(vbs/vt) >*/
- L310:
- evbs = exp(vbs / status_1.vt);
- /*< gbs=cssat*evbs/vt+gmin >*/
- gbs = cssat * evbs / status_1.vt + knstnt_1.gmin;
- /*< cbs=cssat*(evbs-1.0d0) >*/
- cbs = cssat * (evbs - 1.);
- /*< 320 if (vbd.gt.0.0d0) go to 330 >*/
- L320:
- if (vbd > 0.) {
- goto L330;
- }
- /*< gbd=cdsat/vt >*/
- gbd = cdsat / status_1.vt;
- /*< cbd=gbd*vbd >*/
- cbd = gbd * vbd;
- /*< gbd=gbd+gmin >*/
- gbd += knstnt_1.gmin;
- /*< go to 400 >*/
- goto L400;
- /*< 330 evbd=dexp(vbd/vt) >*/
- L330:
- evbd = exp(vbd / status_1.vt);
- /*< gbd=cdsat*evbd/vt+gmin >*/
- gbd = cdsat * evbd / status_1.vt + knstnt_1.gmin;
- /*< cbd=cdsat*(evbd-1.0d0) >*/
- cbd = cdsat * (evbd - 1.);
-
- /* compute drain current and derivatives */
-
- /*< 400 if (vds.lt.0.0d0) go to 450 >*/
- L400:
- if (vds < 0.) {
- goto L450;
- }
-
- /* normal mode */
-
- /*< devmod=1.0d0 >*/
- devmod = 1.;
- /*< value(locv+8)=devmod >*/
- blank_1.value[locv + 7] = devmod;
- /*< go to (405,410,415), lev >*/
- switch (mosarg_1.lev) {
- case 1: goto L405;
- case 2: goto L410;
- case 3: goto L415;
- }
- /*< 405 call moseq1(vds,vbs,vgs,gm,gds,gmbs) >*/
- L405:
- moseq1_(&vds, &vbs, &vgs, &gm, &gds, &gmbs);
- /*< go to 460 >*/
- goto L460;
- /*< 410 call moseq2(vds,vbs,vgs,gm,gds,gmbs, >*/
- /*< 1 qgate,qchan,qbulk,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
- L410:
- moseq2_(&vds, &vbs, &vgs, &gm, &gds, &gmbs, &qgate, &qchan, &qbulk, &cggb,
- &cgdb, &cgsb, &cbgb, &cbdb, &cbsb);
- /*< go to 460 >*/
- goto L460;
- /*< 415 call moseq3(vds,vbs,vgs,gm,gds,gmbs, >*/
- /*< 1 qgate,qchan,qbulk,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
- L415:
- moseq3_(&vds, &vbs, &vgs, &gm, &gds, &gmbs, &qgate, &qchan, &qbulk, &cggb,
- &cgdb, &cgsb, &cbgb, &cbdb, &cbsb);
- /*< go to 460 >*/
- goto L460;
-
- /* inverse mode */
-
- /*< 450 devmod=-1.0d0 >*/
- L450:
- devmod = -1.;
- /*< value(locv+8)=devmod >*/
- blank_1.value[locv + 7] = devmod;
- /*< go to (452,453,454), lev >*/
- switch (mosarg_1.lev) {
- case 1: goto L452;
- case 2: goto L453;
- case 3: goto L454;
- }
- /*< 452 call moseq1(-vds,vbd,vgd,gm,gds,gmbs) >*/
- L452:
- d_1 = -vds;
- moseq1_(&d_1, &vbd, &vgd, &gm, &gds, &gmbs);
- /*< go to 460 >*/
- goto L460;
- /*< 453 call moseq2(-vds,vbd,vgd,gm,gds,gmbs, >*/
- /*< 1 qgate,qchan,qbulk,cggb,cgsb,cgdb,cbgb,cbsb,cbdb) >*/
- L453:
- d_1 = -vds;
- moseq2_(&d_1, &vbd, &vgd, &gm, &gds, &gmbs, &qgate, &qchan, &qbulk, &cggb,
- &cgsb, &cgdb, &cbgb, &cbsb, &cbdb);
- /*< go to 460 >*/
- goto L460;
- /*< 454 call moseq3(-vds,vbd,vgd,gm,gds,gmbs, >*/
- /*< 1 qgate,qchan,qbulk,cggb,cgsb,cgdb,cbgb,cbsb,cbdb) >*/
- L454:
- d_1 = -vds;
- moseq3_(&d_1, &vbd, &vgd, &gm, &gds, &gmbs, &qgate, &qchan, &qbulk, &cggb,
- &cgsb, &cgdb, &cbgb, &cbsb, &cbdb);
- /*< 460 value(locv+9)=type*von >*/
- L460:
- blank_1.value[locv + 8] = type * mosarg_1.von;
- /*< value(locv+10)=type*vdsat >*/
- blank_1.value[locv + 9] = type * mosarg_1.vdsat;
- /*< if (xqco.le.0.5d0) value(locv+15)=xqc >*/
- if (mosarg_1.xqco <= .5) {
- blank_1.value[locv + 14] = mosarg_1.xqc;
- }
-
- /* compute equivalent drain current source */
-
- /*< 490 cd=devmod*cdrain-cbd >*/
- /* L490: */
- cd = devmod * mosarg_1.cdrain - cbd;
- /*< if (mode.ne.1) go to 500 >*/
- if (status_1.mode != 1) {
- goto L500;
- }
- /*< if ((modedc.eq.2).and.(nosolv.ne.0)) go to 500 >*/
- if (status_1.modedc == 2 && status_1.nosolv != 0) {
- goto L500;
- }
- /*< if (initf.eq.4) go to 500 >*/
- if (status_1.initf == 4) {
- goto L500;
- }
- /*< go to 650 >*/
- goto L650;
-
- /* charge storage elements */
-
- /* .. bulk-drain and bulk-source depletion capacitances */
-
- /*< 500 czbd=0.0d0 >*/
- L500:
- czbd = 0.;
- /*< czbs=0.0d0 >*/
- czbs = 0.;
- /*< czbdsw=0.0d0 >*/
- czbdsw = 0.;
- /*< czbssw=0.0d0 >*/
- czbssw = 0.;
- /*< if ((value(locm+9).eq.0.0d0).or.(value(locm+10).eq.0.0d0)) >*/
- /*< 1 go to 505 >*/
- if (blank_1.value[locm + 8] == 0. || blank_1.value[locm + 9] == 0.) {
- goto L505;
- }
- /*< czbd=value(locm+9) >*/
- czbd = blank_1.value[locm + 8];
- /*< czbs=value(locm+10) >*/
- czbs = blank_1.value[locm + 9];
- /*< go to 510 >*/
- goto L510;
- /*< 505 if (value(locm+17).eq.0.0d0) go to 510 >*/
- L505:
- if (blank_1.value[locm + 16] == 0.) {
- goto L510;
- }
- /*< czbd=value(locm+17)*ad >*/
- czbd = blank_1.value[locm + 16] * ad;
- /*< czbs=value(locm+17)*as >*/
- czbs = blank_1.value[locm + 16] * as;
- /*< 510 if (value(locm+19).eq.0.0d0) go to 515 >*/
- L510:
- if (blank_1.value[locm + 18] == 0.) {
- goto L515;
- }
- /*< czbdsw=value(locm+19)*pd >*/
- czbdsw = blank_1.value[locm + 18] * pd;
- /*< czbssw=value(locm+19)*ps >*/
- czbssw = blank_1.value[locm + 18] * ps;
- /*< 515 phib=value(locm+12) >*/
- L515:
- mosarg_1.phib = blank_1.value[locm + 11];
- /*< xmj=value(locm+18) >*/
- xmj = blank_1.value[locm + 17];
- /*< xmjsw=value(locm+20) >*/
- xmjsw = blank_1.value[locm + 19];
- /*< twop=phib+phib >*/
- twop = mosarg_1.phib + mosarg_1.phib;
- /*< fcpb=value(locm+38) >*/
- fcpb = blank_1.value[locm + 37];
- /*< fcpb2=fcpb*fcpb >*/
- fcpb2 = fcpb * fcpb;
- /*< f1=value(locm+40) >*/
- f1 = blank_1.value[locm + 39];
- /*< f2=value(locm+41) >*/
- f2 = blank_1.value[locm + 40];
- /*< f3=value(locm+42) >*/
- f3 = blank_1.value[locm + 41];
- /*< czsf2=czbs/f2 >*/
- czsf2 = czbs / f2;
- /*< czswf2=czbssw/f2 >*/
- czswf2 = czbssw / f2;
- /*< czdf2=czbd/f2 >*/
- czdf2 = czbd / f2;
- /*< czdwf2=czbdsw/f2 >*/
- czdwf2 = czbdsw / f2;
- /*< if (vbs.ge.fcpb) go to 520 >*/
- if (vbs >= fcpb) {
- goto L520;
- }
- /*< arg=1.0d0-vbs/phib >*/
- arg = 1. - vbs / mosarg_1.phib;
- /*< sarg=dexp(-xmj*dlog(arg)) >*/
- sarg = exp(-xmj * log(arg));
- /*< sargsw=dexp(-xmjsw*dlog(arg)) >*/
- sargsw = exp(-xmjsw * log(arg));
- /*< qbs(lx0+loct)=phib*(czbs*(1.0d0-arg*sarg)/(1.0d0-xmj) >*/
- /*< 1 +czbssw*(1.0d0-arg*sargsw)/(1.0d0-xmjsw)) >*/
- qbs[tabinf_1.lx0 + loct - 1] = mosarg_1.phib * (czbs * (1. - arg * sarg) /
- (1. - xmj) + czbssw * (1. - arg * sargsw) / (1. - xmjsw));
- /*< capbs=czbs*sarg+czbssw*sargsw >*/
- capbs = czbs * sarg + czbssw * sargsw;
- /*< go to 525 >*/
- goto L525;
- /*< 520 qbs(lx0+loct)=f1*(czbs+czbssw)+f3*(vbs-fcpb)*(czsf2+czswf2) >*/
- /*< 1 +(vbs*vbs-fcpb*fcpb)*(czsf2*xmj+czswf2*xmjsw) >*/
- L520:
- qbs[tabinf_1.lx0 + loct - 1] = f1 * (czbs + czbssw) + f3 * (vbs - fcpb) *
- (czsf2 + czswf2) + (vbs * vbs - fcpb * fcpb) * (czsf2 * xmj +
- czswf2 * xmjsw);
- /*< capbs=f3*(czsf2+czswf2)+vbs/phib*(czsf2*xmj+czswf2*xmjsw) >*/
- capbs = f3 * (czsf2 + czswf2) + vbs / mosarg_1.phib * (czsf2 * xmj +
- czswf2 * xmjsw);
- /*< 525 if (vbd.ge.fcpb) go to 530 >*/
- L525:
- if (vbd >= fcpb) {
- goto L530;
- }
- /*< arg=1.0d0-vbd/phib >*/
- arg = 1. - vbd / mosarg_1.phib;
- /*< sarg=dexp(-xmj*dlog(arg)) >*/
- sarg = exp(-xmj * log(arg));
- /*< sargsw=dexp(-xmjsw*dlog(arg)) >*/
- sargsw = exp(-xmjsw * log(arg));
- /*< qbd(lx0+loct)=phib*(czbd*(1.0d0-arg*sarg)/(1.0d0-xmj) >*/
- /*< 1 +czbdsw*(1.0d0-arg*sargsw)/(1.0d0-xmjsw)) >*/
- qbd[tabinf_1.lx0 + loct - 1] = mosarg_1.phib * (czbd * (1. - arg * sarg) /
- (1. - xmj) + czbdsw * (1. - arg * sargsw) / (1. - xmjsw));
- /*< capbd=czbd*sarg+czbdsw*sargsw >*/
- capbd = czbd * sarg + czbdsw * sargsw;
- /*< go to 560 >*/
- goto L560;
- /*< 530 qbd(lx0+loct)=f1*(czbd+czbdsw)+f3*(vbd-fcpb)*(czdf2+czdwf2) >*/
- /*< 1 +(vbd*vbd-fcpb*fcpb)*(czdf2*xmj+czdwf2*xmjsw) >*/
- L530:
- qbd[tabinf_1.lx0 + loct - 1] = f1 * (czbd + czbdsw) + f3 * (vbd - fcpb) *
- (czdf2 + czdwf2) + (vbd * vbd - fcpb * fcpb) * (czdf2 * xmj +
- czdwf2 * xmjsw);
- /*< capbd=f3*(czdf2+czdwf2)+vbd/phib*(czdf2*xmj+czdwf2*xmjsw) >*/
- capbd = f3 * (czdf2 + czdwf2) + vbd / mosarg_1.phib * (czdf2 * xmj +
- czdwf2 * xmjsw);
-
- /*< 560 if (xqco.le.0.5d0) go to 650 >*/
- L560:
- if (mosarg_1.xqco <= .5) {
- goto L650;
- }
- /*< if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 650 >*/
- if (status_1.mode == 1 && status_1.modedc == 2 && status_1.nosolv != 0) {
- goto L650;
- }
- /*< if (initf.ne.4) go to 600 >*/
- if (status_1.initf != 4) {
- goto L600;
- }
- /*< go to 705 >*/
- goto L705;
-
- /* c calculate equivalent conductances and currents for */
- /* c depletion capacitors */
-
- /*< 600 if (initf.ne.5) go to 610 >*/
- L600:
- if (status_1.initf != 5) {
- goto L610;
- }
- /*< qbd(lx1+loct)=qbd(lx0+loct) >*/
- qbd[tabinf_1.lx1 + loct - 1] = qbd[tabinf_1.lx0 + loct - 1];
- /*< qbs(lx1+loct)=qbs(lx0+loct) >*/
- qbs[tabinf_1.lx1 + loct - 1] = qbs[tabinf_1.lx0 + loct - 1];
- /*< 610 call intgr8(geq,ceq,capbd,loct+24) >*/
- L610:
- i_1 = loct + 24;
- intgr8_(&geq, &ceq, &capbd, &i_1);
- /*< gbd=gbd+geq >*/
- gbd += geq;
- /*< cbd=cbd+cqbd(lx0+loct) >*/
- cbd += cqbd[tabinf_1.lx0 + loct - 1];
- /*< cd=cd-cqbd(lx0+loct) >*/
- cd -= cqbd[tabinf_1.lx0 + loct - 1];
- /*< call intgr8(geq,ceq,capbs,loct+26) >*/
- i_1 = loct + 26;
- intgr8_(&geq, &ceq, &capbs, &i_1);
- /*< gbs=gbs+geq >*/
- gbs += geq;
- /*< cbs=cbs+cqbs(lx0+loct) >*/
- cbs += cqbs[tabinf_1.lx0 + loct - 1];
- /*< if (initf.ne.5) go to 650 >*/
- if (status_1.initf != 5) {
- goto L650;
- }
- /*< cqbd(lx1+loct)=cqbd(lx0+loct) >*/
- cqbd[tabinf_1.lx1 + loct - 1] = cqbd[tabinf_1.lx0 + loct - 1];
- /*< cqbs(lx1+loct)=cqbs(lx0+loct) >*/
- cqbs[tabinf_1.lx1 + loct - 1] = cqbs[tabinf_1.lx0 + loct - 1];
-
- /* check convergence */
-
- /*< 650 if (initf.ne.3) go to 660 >*/
- L650:
- if (status_1.initf != 3) {
- goto L660;
- }
- /*< if (ioff.ne.0) go to 680 >*/
- if (ioff != 0) {
- goto L680;
- }
- /*< 660 if (icheck.eq.1) go to 670 >*/
- L660:
- if (icheck == 1) {
- goto L670;
- }
- /*< tol=reltol*dmax1(dabs(cdhat),dabs(cd))+abstol >*/
- /* Computing MAX */
- d_1 = abs(cdhat), d_2 = abs(cd);
- tol = knstnt_1.reltol * max(d_2,d_1) + knstnt_1.abstol;
- /*< if (dabs(cdhat-cd).ge.tol) go to 670 >*/
- if ((d_1 = cdhat - cd, abs(d_1)) >= tol) {
- goto L670;
- }
- /*< tol=reltol*dmax1(dabs(cbhat),dabs(cbs+cbd))+abstol >*/
- /* Computing MAX */
- d_2 = abs(cbhat), d_3 = (d_1 = cbs + cbd, abs(d_1));
- tol = knstnt_1.reltol * max(d_3,d_2) + knstnt_1.abstol;
- /*< if (dabs(cbhat-(cbs+cbd)).le.tol) go to 680 >*/
- if ((d_1 = cbhat - (cbs + cbd), abs(d_1)) <= tol) {
- goto L680;
- }
- /*< 670 noncon=noncon+1 >*/
- L670:
- ++status_1.noncon;
- /*< 680 vbso(lx0+loct)=vbs >*/
- L680:
- vbso[tabinf_1.lx0 + loct - 1] = vbs;
- /*< vbdo(lx0+loct)=vbd >*/
- vbdo[tabinf_1.lx0 + loct - 1] = vbd;
- /*< vgso(lx0+loct)=vgs >*/
- vgso[tabinf_1.lx0 + loct - 1] = vgs;
- /*< vdso(lx0+loct)=vds >*/
- vdso[tabinf_1.lx0 + loct - 1] = vds;
- /*< cdo(lx0+loct)=cd >*/
- cdo[tabinf_1.lx0 + loct - 1] = cd;
- /*< cbso(lx0+loct)=cbs >*/
- cbso[tabinf_1.lx0 + loct - 1] = cbs;
- /*< cbdo(lx0+loct)=cbd >*/
- cbdo[tabinf_1.lx0 + loct - 1] = cbd;
- /*< gmo(lx0+loct)=gm >*/
- gmo[tabinf_1.lx0 + loct - 1] = gm;
- /*< gdso(lx0+loct)=gds >*/
- gdso[tabinf_1.lx0 + loct - 1] = gds;
- /*< gmbso(lx0+loct)=gmbs >*/
- gmbso[tabinf_1.lx0 + loct - 1] = gmbs;
- /*< gbdo(lx0+loct)=gbd >*/
- gbdo[tabinf_1.lx0 + loct - 1] = gbd;
- /*< gbso(lx0+loct)=gbs >*/
- gbso[tabinf_1.lx0 + loct - 1] = gbs;
- /*< if (xqco.le.0.5d0) go to 690 >*/
- if (mosarg_1.xqco <= .5) {
- goto L690;
- }
- /*< vono(lx0+loct)=von >*/
- vono[tabinf_1.lx0 + loct - 1] = mosarg_1.von;
- /*< vdsato(lx0+loct)=vdsat >*/
- vdsato[tabinf_1.lx0 + loct - 1] = mosarg_1.vdsat;
- /*< go to 700 >*/
- goto L700;
- /*< 690 cggbo(lx0+loct)=cggb >*/
- L690:
- cggbo[tabinf_1.lx0 + loct - 1] = cggb;
- /*< cgdbo(lx0+loct)=cgdb >*/
- cgdbo[tabinf_1.lx0 + loct - 1] = cgdb;
- /*< cgsbo(lx0+loct)=cgsb >*/
- cgsbo[tabinf_1.lx0 + loct - 1] = cgsb;
- /*< cbgbo(lx0+loct)=cbgb >*/
- cbgbo[tabinf_1.lx0 + loct - 1] = cbgb;
- /*< cbdbo(lx0+loct)=cbdb >*/
- cbdbo[tabinf_1.lx0 + loct - 1] = cbdb;
- /*< cbsbo(lx0+loct)=cbsb >*/
- cbsbo[tabinf_1.lx0 + loct - 1] = cbsb;
- /*< go to 750 >*/
- goto L750;
-
- /* xqco > 0.5d0 use meyer"s capacitor model */
-
- /*< 700 if (mode.ne.1) go to 705 >*/
- L700:
- if (status_1.mode != 1) {
- goto L705;
- }
- /*< if ((modedc.eq.2).and.(nosolv.ne.0)) go to 705 >*/
- if (status_1.modedc == 2 && status_1.nosolv != 0) {
- goto L705;
- }
- /*< if (initf.eq.4) go to 705 >*/
- if (status_1.initf == 4) {
- goto L705;
- }
- /*< go to 742 >*/
- goto L742;
-
- /* calculate meyer's capacitors */
-
- /*< 705 von1=von >*/
- L705:
- von1 = mosarg_1.von;
- /*< vgs1=vgs >*/
- vgs1 = vgs;
- /*< vgd1=vgd >*/
- vgd1 = vgd;
- /*< vgb1=vgs-vbs >*/
- vgb1 = vgs - vbs;
- /*< vdsat1=vdsat >*/
- vdsat1 = mosarg_1.vdsat;
- /*< if ((mode.ne.2).or.(initf.eq.5)) go to 710 >*/
- if (status_1.mode != 2 || status_1.initf == 5) {
- goto L710;
- }
- /*< von1=vono(lx1+loct) >*/
- von1 = vono[tabinf_1.lx1 + loct - 1];
- /*< vgs1=vgso(lx1+loct) >*/
- vgs1 = vgso[tabinf_1.lx1 + loct - 1];
- /*< vgd1=vgs1-vdso(lx1+loct) >*/
- vgd1 = vgs1 - vdso[tabinf_1.lx1 + loct - 1];
- /*< vgb1=vgs1-vbso(lx1+loct) >*/
- vgb1 = vgs1 - vbso[tabinf_1.lx1 + loct - 1];
- /*< vdsat1=vdsato(lx1+loct) >*/
- vdsat1 = vdsato[tabinf_1.lx1 + loct - 1];
- /*< 710 if (devmod.lt.0.0d0) go to 715 >*/
- L710:
- if (devmod < 0.) {
- goto L715;
- }
- /*< call cmeyer (vgs1,vgd1,vgb1,von1,vdsat1,vgs,vgd,vgb, >*/
- /*< 1 covlgs,covlgd,covlgb,cgs1,cgd1,cgb1,cgs,cgd,cgb) >*/
- cmeyer_(&vgs1, &vgd1, &vgb1, &von1, &vdsat1, &vgs, &vgd, &vgb, &covlgs, &
- covlgd, &covlgb, &cgs1, &cgd1, &cgb1, &cgs, &cgd, &cgb);
- /*< go to 720 >*/
- goto L720;
- /*< 715 call cmeyer (vgd1,vgs1,vgb1,von1,vdsat1,vgd,vgs,vgb, >*/
- /*< 1 covlgd,covlgs,covlgb,cgd1,cgs1,cgb1,cgd,cgs,cgb) >*/
- L715:
- cmeyer_(&vgd1, &vgs1, &vgb1, &von1, &vdsat1, &vgd, &vgs, &vgb, &covlgd, &
- covlgs, &covlgb, &cgd1, &cgs1, &cgb1, &cgd, &cgs, &cgb);
- /*< 720 cgs=0.5d0*(cgs+cgs1) >*/
- L720:
- cgs = (cgs + cgs1) * .5;
- /*< cgd=0.5d0*(cgd+cgd1) >*/
- cgd = (cgd + cgd1) * .5;
- /*< cgb=0.5d0*(cgb+cgb1) >*/
- cgb = (cgb + cgb1) * .5;
-
- /* store small-signal parameters (for meyer"s model) */
-
- /*< if (mode.ne.1) go to 730 >*/
- if (status_1.mode != 1) {
- goto L730;
- }
- /*< if (initf.ne.4) go to 730 >*/
- if (status_1.initf != 4) {
- goto L730;
- }
- /*< value(lx0+loct+24)=capbd >*/
- blank_1.value[tabinf_1.lx0 + loct + 23] = capbd;
- /*< value(lx0+loct+26)=capbs >*/
- blank_1.value[tabinf_1.lx0 + loct + 25] = capbs;
- /*< value(lx0+loct+12)=cgs-covlgs >*/
- blank_1.value[tabinf_1.lx0 + loct + 11] = cgs - covlgs;
- /*< value(lx0+loct+14)=cgd-covlgd >*/
- blank_1.value[tabinf_1.lx0 + loct + 13] = cgd - covlgd;
- /*< value(lx0+loct+16)=cgb-covlgb >*/
- blank_1.value[tabinf_1.lx0 + loct + 15] = cgb - covlgb;
- /*< go to 1000 >*/
- goto L1000;
- /* c */
- /*< 730 if (initf.ne.6) go to 735 >*/
- L730:
- if (status_1.initf != 6) {
- goto L735;
- }
- /*< qgs(lx0+loct)=(1.0d0+xfact)*qgs(lx1+loct)-xfact*qgs(lx2+loct) >*/
- qgs[tabinf_1.lx0 + loct - 1] = (xfact + 1.) * qgs[tabinf_1.lx1 + loct - 1]
- - xfact * qgs[tabinf_1.lx2 + loct - 1];
- /*< qgd(lx0+loct)=(1.0d0+xfact)*qgd(lx1+loct)-xfact*qgd(lx2+loct) >*/
- qgd[tabinf_1.lx0 + loct - 1] = (xfact + 1.) * qgd[tabinf_1.lx1 + loct - 1]
- - xfact * qgd[tabinf_1.lx2 + loct - 1];
- /*< qgb(lx0+loct)=(1.0d0+xfact)*qgb(lx1+loct)-xfact*qgb(lx2+loct) >*/
- qgb[tabinf_1.lx0 + loct - 1] = (xfact + 1.) * qgb[tabinf_1.lx1 + loct - 1]
- - xfact * qgb[tabinf_1.lx2 + loct - 1];
- /*< go to 745 >*/
- goto L745;
- /*< 735 qgs(lx0+loct)=(vgs-vgs1)*cgs >*/
- L735:
- qgs[tabinf_1.lx0 + loct - 1] = (vgs - vgs1) * cgs;
- /*< qgd(lx0+loct)=(vgd-vgd1)*cgd >*/
- qgd[tabinf_1.lx0 + loct - 1] = (vgd - vgd1) * cgd;
- /*< qgb(lx0+loct)=(vgb-vgb1)*cgb >*/
- qgb[tabinf_1.lx0 + loct - 1] = (vgb - vgb1) * cgb;
- /*< if((mode.ne.2).or.(initf.eq.5))go to 740 >*/
- if (status_1.mode != 2 || status_1.initf == 5) {
- goto L740;
- }
- /*< qgs(lx0+loct)=qgs(lx0+loct)+qgs(lx1+loct) >*/
- qgs[tabinf_1.lx0 + loct - 1] += qgs[tabinf_1.lx1 + loct - 1];
- /*< qgd(lx0+loct)=qgd(lx0+loct)+qgd(lx1+loct) >*/
- qgd[tabinf_1.lx0 + loct - 1] += qgd[tabinf_1.lx1 + loct - 1];
- /*< qgb(lx0+loct)=qgb(lx0+loct)+qgb(lx1+loct) >*/
- qgb[tabinf_1.lx0 + loct - 1] += qgb[tabinf_1.lx1 + loct - 1];
- /*< 740 if((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 742 >*/
- L740:
- if (status_1.mode == 1 && status_1.modedc == 2 && status_1.nosolv != 0) {
- goto L742;
- }
- /*< if (initf.ne.5) go to 745 >*/
- if (status_1.initf != 5) {
- goto L745;
- }
- /*< qgs(lx0+loct)=cgs*vgs >*/
- qgs[tabinf_1.lx0 + loct - 1] = cgs * vgs;
- /*< qgd(lx0+loct)=cgd*vgd >*/
- qgd[tabinf_1.lx0 + loct - 1] = cgd * vgd;
- /*< qgb(lx0+loct)=cgb*vgb >*/
- qgb[tabinf_1.lx0 + loct - 1] = cgb * vgb;
- /*< qgs(lx1+loct)=qgs(lx0+loct) >*/
- qgs[tabinf_1.lx1 + loct - 1] = qgs[tabinf_1.lx0 + loct - 1];
- /*< qgd(lx1+loct)=qgd(lx0+loct) >*/
- qgd[tabinf_1.lx1 + loct - 1] = qgd[tabinf_1.lx0 + loct - 1];
- /*< qgb(lx1+loct)=qgb(lx0+loct) >*/
- qgb[tabinf_1.lx1 + loct - 1] = qgb[tabinf_1.lx0 + loct - 1];
-
- /* initialize to zero charge conductances and current */
-
- /*< 742 gcgs=0.0d0 >*/
- L742:
- gcgs = 0.;
- /*< ceqgs=0.0d0 >*/
- ceqgs = 0.;
- /*< gcgd=0.0d0 >*/
- gcgd = 0.;
- /*< ceqgd=0.0d0 >*/
- ceqgd = 0.;
- /*< gcgb=0.0d0 >*/
- gcgb = 0.;
- /*< ceqgb=0.0d0 >*/
- ceqgb = 0.;
- /*< go to 870 >*/
- goto L870;
- /* c */
- /*< 745 if(cgs.eq.0.0d0) value(lx0+loct+13)=0.0d0 >*/
- L745:
- if (cgs == 0.) {
- blank_1.value[tabinf_1.lx0 + loct + 12] = 0.;
- }
- /*< if(cgd.eq.0.0d0) value(lx0+loct+15)=0.0d0 >*/
- if (cgd == 0.) {
- blank_1.value[tabinf_1.lx0 + loct + 14] = 0.;
- }
- /*< if(cgb.eq.0.0d0) value(lx0+loct+17)=0.0d0 >*/
- if (cgb == 0.) {
- blank_1.value[tabinf_1.lx0 + loct + 16] = 0.;
- }
- /* c */
- /* c calculate equivalent conductances and currents for */
- /* c meyer"s capacitors */
- /* c */
- /*< call intgr8(gcgs,ceqgs,cgs,loct+12) >*/
- i_1 = loct + 12;
- intgr8_(&gcgs, &ceqgs, &cgs, &i_1);
- /*< call intgr8(gcgd,ceqgd,cgd,loct+14) >*/
- i_1 = loct + 14;
- intgr8_(&gcgd, &ceqgd, &cgd, &i_1);
- /*< call intgr8(gcgb,ceqgb,cgb,loct+16) >*/
- i_1 = loct + 16;
- intgr8_(&gcgb, &ceqgb, &cgb, &i_1);
- /*< ceqgs=ceqgs-gcgs*vgs+ag(1)*qgs(lx0+loct) >*/
- ceqgs = ceqgs - gcgs * vgs + status_1.ag[0] * qgs[tabinf_1.lx0 + loct - 1]
- ;
- /*< ceqgd=ceqgd-gcgd*vgd+ag(1)*qgd(lx0+loct) >*/
- ceqgd = ceqgd - gcgd * vgd + status_1.ag[0] * qgd[tabinf_1.lx0 + loct - 1]
- ;
- /*< ceqgb=ceqgb-gcgb*vgb+ag(1)*qgb(lx0+loct) >*/
- ceqgb = ceqgb - gcgb * vgb + status_1.ag[0] * qgb[tabinf_1.lx0 + loct - 1]
- ;
- /*< if (initf.ne.5) go to 870 >*/
- if (status_1.initf != 5) {
- goto L870;
- }
- /*< cqgs(lx1+loct)=cqgs(lx0+loct) >*/
- cqgs[tabinf_1.lx1 + loct - 1] = cqgs[tabinf_1.lx0 + loct - 1];
- /*< cqgd(lx1+loct)=cqgd(lx0+loct) >*/
- cqgd[tabinf_1.lx1 + loct - 1] = cqgd[tabinf_1.lx0 + loct - 1];
- /*< cqgb(lx1+loct)=cqgb(lx0+loct) >*/
- cqgb[tabinf_1.lx1 + loct - 1] = cqgb[tabinf_1.lx0 + loct - 1];
- /*< go to 870 >*/
- goto L870;
-
- /* .. bulk and channel charge (plus overlaps) */
-
- /*< 750 if (mode.ne.1) go to 755 >*/
- L750:
- if (status_1.mode != 1) {
- goto L755;
- }
- /*< if ((modedc.eq.2).and.(nosolv.ne.0)) go to 755 >*/
- if (status_1.modedc == 2 && status_1.nosolv != 0) {
- goto L755;
- }
- /*< if (initf.eq.4) go to 755 >*/
- if (status_1.initf == 4) {
- goto L755;
- }
- /*< go to 850 >*/
- goto L850;
- /*< 755 if (devmod.eq.-1.0d0) go to 760 >*/
- L755:
- if (devmod == -1.) {
- goto L760;
- }
- /*< call moscap(vgd,vgs,vgb,covlgd,covlgs,covlgb, >*/
- /*< 1 capbd,capbs,cggb,cgdb,cgsb,cbgb,cbdb,cbsb, >*/
- /*< 2 gcggb,gcgdb,gcgsb,gcbgb,gcbdb,gcbsb, >*/
- /*< 3 gcdgb,gcddb,gcdsb,gcsgb,gcsdb,gcssb, >*/
- /*< 4 qgate,qchan,qbulk,qdrn,qsrc) >*/
- moscap_(&vgd, &vgs, &vgb, &covlgd, &covlgs, &covlgb, &capbd, &capbs, &
- cggb, &cgdb, &cgsb, &cbgb, &cbdb, &cbsb, &gcggb, &gcgdb, &gcgsb, &
- gcbgb, &gcbdb, &gcbsb, &gcdgb, &gcddb, &gcdsb, &gcsgb, &gcsdb, &
- gcssb, &qgate, &qchan, &qbulk, &qdrn, &qsrc);
- /*< go to 780 >*/
- goto L780;
- /*< 760 call moscap(vgs,vgd,vgb,covlgs,covlgd,covlgb, >*/
- /*< 1 capbs,capbd,cggb,cgsb,cgdb,cbgb,cbsb,cbdb, >*/
- /*< 2 gcggb,gcgsb,gcgdb,gcbgb,gcbsb,gcbdb, >*/
- /*< 3 gcsgb,gcssb,gcsdb,gcdgb,gcdsb,gcddb, >*/
- /*< 4 qgate,qchan,qbulk,qsrc,qdrn) >*/
- L760:
- moscap_(&vgs, &vgd, &vgb, &covlgs, &covlgd, &covlgb, &capbs, &capbd, &
- cggb, &cgsb, &cgdb, &cbgb, &cbsb, &cbdb, &gcggb, &gcgsb, &gcgdb, &
- gcbgb, &gcbsb, &gcbdb, &gcsgb, &gcssb, &gcsdb, &gcdgb, &gcdsb, &
- gcddb, &qgate, &qchan, &qbulk, &qsrc, &qdrn);
- /*< 780 if (ibypas.eq.1) go to 860 >*/
- L780:
- if (ibypas == 1) {
- goto L860;
- }
- /*< qg(lx0+loct)=qgate >*/
- qg[tabinf_1.lx0 + loct - 1] = qgate;
- /*< qd(lx0+loct)=qdrn-qbd(lx0+loct) >*/
- qd[tabinf_1.lx0 + loct - 1] = qdrn - qbd[tabinf_1.lx0 + loct - 1];
- /*< qb(lx0+loct)=qbulk+qbd(lx0+loct)+qbs(lx0+loct) >*/
- qb[tabinf_1.lx0 + loct - 1] = qbulk + qbd[tabinf_1.lx0 + loct - 1] + qbs[
- tabinf_1.lx0 + loct - 1];
-
- /* store small-signal parameters */
-
- /*< 790 if ((mode.eq.1).and.(modedc.eq.2).and.(nosolv.ne.0)) go to 850 >*/
- /* L790: */
- if (status_1.mode == 1 && status_1.modedc == 2 && status_1.nosolv != 0) {
- goto L850;
- }
- /*< if (initf.ne.4) go to 800 >*/
- if (status_1.initf != 4) {
- goto L800;
- }
- /*< value(lx0+loct+18)=cggb >*/
- blank_1.value[tabinf_1.lx0 + loct + 17] = cggb;
- /*< value(lx0+loct+19)=cgdb >*/
- blank_1.value[tabinf_1.lx0 + loct + 18] = cgdb;
- /*< value(lx0+loct+20)=cgsb >*/
- blank_1.value[tabinf_1.lx0 + loct + 19] = cgsb;
- /*< value(lx0+loct+21)=cbgb >*/
- blank_1.value[tabinf_1.lx0 + loct + 20] = cbgb;
- /*< value(lx0+loct+22)=cbdb >*/
- blank_1.value[tabinf_1.lx0 + loct + 21] = cbdb;
- /*< value(lx0+loct+23)=cbsb >*/
- blank_1.value[tabinf_1.lx0 + loct + 22] = cbsb;
- /*< value(lx0+loct+24)=capbd >*/
- blank_1.value[tabinf_1.lx0 + loct + 23] = capbd;
- /*< value(lx0+loct+26)=capbs >*/
- blank_1.value[tabinf_1.lx0 + loct + 25] = capbs;
- /*< go to 1000 >*/
- goto L1000;
-
- /* transient analysis */
-
- /*< 800 if (initf.ne.5) go to 810 >*/
- L800:
- if (status_1.initf != 5) {
- goto L810;
- }
- /*< qb(lx1+loct)=qb(lx0+loct) >*/
- qb[tabinf_1.lx1 + loct - 1] = qb[tabinf_1.lx0 + loct - 1];
- /*< qg(lx1+loct)=qg(lx0+loct) >*/
- qg[tabinf_1.lx1 + loct - 1] = qg[tabinf_1.lx0 + loct - 1];
- /*< qd(lx1+loct)=qd(lx0+loct) >*/
- qd[tabinf_1.lx1 + loct - 1] = qd[tabinf_1.lx0 + loct - 1];
- /* .. integrate qb */
- /*< 810 call intgr8(geq,ceq,0.0d0,loct+12) >*/
- L810:
- i_1 = loct + 12;
- intgr8_(&geq, &ceq, &c_b73, &i_1);
- /* .. integrate qg */
- /*< call intgr8(geq,ceq,0.0d0,loct+14) >*/
- i_1 = loct + 14;
- intgr8_(&geq, &ceq, &c_b73, &i_1);
- /* .. integrate qd */
- /*< call intgr8(geq,ceq,0.0d0,loct+16) >*/
- i_1 = loct + 16;
- intgr8_(&geq, &ceq, &c_b73, &i_1);
- /*< go to 860 >*/
- goto L860;
-
- /* initialize to zero charge conductances and current */
-
- /*< 850 ceqqg=0.0d0 >*/
- L850:
- ceqqg = 0.;
- /*< ceqqb=0.0d0 >*/
- ceqqb = 0.;
- /*< ceqqd=0.0d0 >*/
- ceqqd = 0.;
- /*< gcdgb=0.0d0 >*/
- gcdgb = 0.;
- /*< gcddb=0.0d0 >*/
- gcddb = 0.;
- /*< gcdsb=0.0d0 >*/
- gcdsb = 0.;
- /*< gcsgb=0.0d0 >*/
- gcsgb = 0.;
- /*< gcsdb=0.0d0 >*/
- gcsdb = 0.;
- /*< gcssb=0.0d0 >*/
- gcssb = 0.;
- /*< gcggb=0.0d0 >*/
- gcggb = 0.;
- /*< gcgdb=0.0d0 >*/
- gcgdb = 0.;
- /*< gcgsb=0.0d0 >*/
- gcgsb = 0.;
- /*< gcbgb=0.0d0 >*/
- gcbgb = 0.;
- /*< gcbdb=0.0d0 >*/
- gcbdb = 0.;
- /*< gcbsb=0.0d0 >*/
- gcbsb = 0.;
- /*< go to 900 >*/
- goto L900;
-
- /* evaluate equivalent charge currents */
-
- /*< 860 cgate=cqg(lx0+loct) >*/
- L860:
- cgate = cqg[tabinf_1.lx0 + loct - 1];
- /*< cqbulk=cqb(lx0+loct) >*/
- cqbulk = cqb[tabinf_1.lx0 + loct - 1];
- /*< cqdrn=cqd(lx0+loct) >*/
- cqdrn = cqd[tabinf_1.lx0 + loct - 1];
- /*< ceqqg=cgate-gcggb*vgb+gcgdb*vbd+gcgsb*vbs >*/
- ceqqg = cgate - gcggb * vgb + gcgdb * vbd + gcgsb * vbs;
- /*< ceqqb=cqbulk-gcbgb*vgb+gcbdb*vbd+gcbsb*vbs >*/
- ceqqb = cqbulk - gcbgb * vgb + gcbdb * vbd + gcbsb * vbs;
- /*< ceqqd=cqdrn-gcdgb*vgb+gcddb*vbd+gcdsb*vbs >*/
- ceqqd = cqdrn - gcdgb * vgb + gcddb * vbd + gcdsb * vbs;
- /*< if (initf.ne.5) go to 900 >*/
- if (status_1.initf != 5) {
- goto L900;
- }
- /*< cqb(lx1+loct)=cqb(lx0+loct) >*/
- cqb[tabinf_1.lx1 + loct - 1] = cqb[tabinf_1.lx0 + loct - 1];
- /*< cqg(lx1+loct)=cqg(lx0+loct) >*/
- cqg[tabinf_1.lx1 + loct - 1] = cqg[tabinf_1.lx0 + loct - 1];
- /*< cqd(lx1+loct)=cqd(lx0+loct) >*/
- cqd[tabinf_1.lx1 + loct - 1] = cqd[tabinf_1.lx0 + loct - 1];
- /*< go to 900 >*/
- goto L900;
-
- /* c do the mapping from meyer"s capacitor model into the charge */
- /* c oriented model */
- /* c */
- /*< 870 ceqqg=ceqgs+ceqgb+ceqgd >*/
- L870:
- ceqqg = ceqgs + ceqgb + ceqgd;
- /*< ceqqb=-ceqgb >*/
- ceqqb = -ceqgb;
- /*< ceqqd=-ceqgd >*/
- ceqqd = -ceqgd;
- /*< gcbdb=0.0d0 >*/
- gcbdb = 0.;
- /*< gcbsb=0.0d0 >*/
- gcbsb = 0.;
- /*< gcdsb=0.0d0 >*/
- gcdsb = 0.;
- /*< gcsdb=0.0d0 >*/
- gcsdb = 0.;
- /*< gcgdb=-gcgd >*/
- gcgdb = -gcgd;
- /*< gcgsb=-gcgs >*/
- gcgsb = -gcgs;
- /*< gcbgb=-gcgb >*/
- gcbgb = -gcgb;
- /*< gcdgb=-gcgd >*/
- gcdgb = -gcgd;
- /*< gcsgb=-gcgs >*/
- gcsgb = -gcgs;
- /*< gcssb=gcgs >*/
- gcssb = gcgs;
- /*< gcddb=gcgd >*/
- gcddb = gcgd;
- /*< gcggb=gcgd+gcgs+gcgb >*/
- gcggb = gcgd + gcgs + gcgb;
-
- /* store charge storage info for meyer's cap in lx table */
-
- /*< cgbo(lx0+loct)=cgb >*/
- cgbo[tabinf_1.lx0 + loct - 1] = cgb;
- /*< cgso(lx0+loct)=cgs >*/
- cgso[tabinf_1.lx0 + loct - 1] = cgs;
- /*< cgdo(lx0+loct)=cgd >*/
- cgdo[tabinf_1.lx0 + loct - 1] = cgd;
-
- /* load current vector */
-
- /*< 900 ceqbs=type*(cbs-(gbs-gmin)*vbs) >*/
- L900:
- ceqbs = type * (cbs - (gbs - knstnt_1.gmin) * vbs);
- /*< ceqbd=type*(cbd-(gbd-gmin)*vbd) >*/
- ceqbd = type * (cbd - (gbd - knstnt_1.gmin) * vbd);
- /*< ceqqg=type*ceqqg >*/
- ceqqg = type * ceqqg;
- /*< ceqqb=type*ceqqb >*/
- ceqqb = type * ceqqb;
- /*< ceqqd=type*ceqqd >*/
- ceqqd = type * ceqqd;
- /*< xnrm=1.0d0 >*/
- xnrm = 1.;
- /*< xrev=0.0d0 >*/
- xrev = 0.;
- /*< if (devmod.lt.0.0d0) go to 910 >*/
- if (devmod < 0.) {
- goto L910;
- }
- /*< cdreq=type*(cdrain-gds*vds-gm*vgs-gmbs*vbs) >*/
- cdreq = type * (mosarg_1.cdrain - gds * vds - gm * vgs - gmbs * vbs);
- /*< go to 920 >*/
- goto L920;
- /*< 910 xnrm=0.0d0 >*/
- L910:
- xnrm = 0.;
- /*< xrev=1.0d0 >*/
- xrev = 1.;
- /*< cdreq=-type*(cdrain-gds*(-vds)-gm*vgd-gmbs*vbd) >*/
- cdreq = -type * (mosarg_1.cdrain - gds * (-vds) - gm * vgd - gmbs * vbd);
- /*< 920 value(lvn+node2)=value(lvn+node2)-ceqqg >*/
- L920:
- blank_1.value[tabinf_1.lvn + node2 - 1] -= ceqqg;
- /*< value(lvn+node4)=value(lvn+node4)-ceqbs-ceqbd-ceqqb >*/
- blank_1.value[tabinf_1.lvn + node4 - 1] = blank_1.value[tabinf_1.lvn +
- node4 - 1] - ceqbs - ceqbd - ceqqb;
- /*< value(lvn+node5)=value(lvn+node5)-cdreq+ceqbd-ceqqd >*/
- blank_1.value[tabinf_1.lvn + node5 - 1] = blank_1.value[tabinf_1.lvn +
- node5 - 1] - cdreq + ceqbd - ceqqd;
- /*< value(lvn+node6)=value(lvn+node6)+cdreq+ceqbs >*/
- /*< 1 +ceqqg+ceqqb+ceqqd >*/
- blank_1.value[tabinf_1.lvn + node6 - 1] = blank_1.value[tabinf_1.lvn +
- node6 - 1] + cdreq + ceqbs + ceqqg + ceqqb + ceqqd;
-
- /* load y matrix */
-
- /*< locy=lvn+nodplc(loc+27) >*/
- locy = tabinf_1.lvn + nodplc[loc + 26];
- /*< value(locy)=value(locy)+gdpr >*/
- blank_1.value[locy - 1] += gdpr;
- /*< locy=lvn+nodplc(loc+28) >*/
- locy = tabinf_1.lvn + nodplc[loc + 27];
- /*< value(locy)=value(locy)+gcggb >*/
- blank_1.value[locy - 1] += gcggb;
- /*< locy=lvn+nodplc(loc+29) >*/
- locy = tabinf_1.lvn + nodplc[loc + 28];
- /*< value(locy)=value(locy)+gspr >*/
- blank_1.value[locy - 1] += gspr;
- /*< locy=lvn+nodplc(loc+30) >*/
- locy = tabinf_1.lvn + nodplc[loc + 29];
- /*< value(locy)=value(locy)+gbd+gbs-gcbgb-gcbdb-gcbsb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] + gbd + gbs - gcbgb -
- gcbdb - gcbsb;
- /*< locy=lvn+nodplc(loc+31) >*/
- locy = tabinf_1.lvn + nodplc[loc + 30];
- /*< value(locy)=value(locy)+gdpr+gds+gbd+xrev*(gm+gmbs)+gcddb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] + gdpr + gds + gbd +
- xrev * (gm + gmbs) + gcddb;
- /*< locy=lvn+nodplc(loc+32) >*/
- locy = tabinf_1.lvn + nodplc[loc + 31];
- /*< value(locy)=value(locy)+gspr+gds+gbs+xnrm*(gm+gmbs)+gcssb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] + gspr + gds + gbs +
- xnrm * (gm + gmbs) + gcssb;
- /*< locy=lvn+nodplc(loc+10) >*/
- locy = tabinf_1.lvn + nodplc[loc + 9];
- /*< value(locy)=value(locy)-gdpr >*/
- blank_1.value[locy - 1] -= gdpr;
- /*< locy=lvn+nodplc(loc+11) >*/
- locy = tabinf_1.lvn + nodplc[loc + 10];
- /*< value(locy)=value(locy)-gcggb-gcgdb-gcgsb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] - gcggb - gcgdb - gcgsb;
-
- /*< locy=lvn+nodplc(loc+12) >*/
- locy = tabinf_1.lvn + nodplc[loc + 11];
- /*< value(locy)=value(locy)+gcgdb >*/
- blank_1.value[locy - 1] += gcgdb;
- /*< locy=lvn+nodplc(loc+13) >*/
- locy = tabinf_1.lvn + nodplc[loc + 12];
- /*< value(locy)=value(locy)+gcgsb >*/
- blank_1.value[locy - 1] += gcgsb;
- /*< locy=lvn+nodplc(loc+14) >*/
- locy = tabinf_1.lvn + nodplc[loc + 13];
- /*< value(locy)=value(locy)-gspr >*/
- blank_1.value[locy - 1] -= gspr;
- /*< locy=lvn+nodplc(loc+15) >*/
- locy = tabinf_1.lvn + nodplc[loc + 14];
- /*< value(locy)=value(locy)+gcbgb >*/
- blank_1.value[locy - 1] += gcbgb;
- /*< locy=lvn+nodplc(loc+16) >*/
- locy = tabinf_1.lvn + nodplc[loc + 15];
- /*< value(locy)=value(locy)-gbd+gcbdb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] - gbd + gcbdb;
- /*< locy=lvn+nodplc(loc+17) >*/
- locy = tabinf_1.lvn + nodplc[loc + 16];
- /*< value(locy)=value(locy)-gbs+gcbsb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] - gbs + gcbsb;
- /*< locy=lvn+nodplc(loc+18) >*/
- locy = tabinf_1.lvn + nodplc[loc + 17];
- /*< value(locy)=value(locy)-gdpr >*/
- blank_1.value[locy - 1] -= gdpr;
- /*< locy=lvn+nodplc(loc+19) >*/
- locy = tabinf_1.lvn + nodplc[loc + 18];
- /*< value(locy)=value(locy)+(xnrm-xrev)*gm+gcdgb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] + (xnrm - xrev) * gm +
- gcdgb;
- /*< locy=lvn+nodplc(loc+20) >*/
- locy = tabinf_1.lvn + nodplc[loc + 19];
- /*< value(locy)=value(locy)-gbd+(xnrm-xrev)*gmbs- >*/
- /*< 1 gcdgb-gcddb-gcdsb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] - gbd + (xnrm - xrev) *
- gmbs - gcdgb - gcddb - gcdsb;
- /*< locy=lvn+nodplc(loc+21) >*/
- locy = tabinf_1.lvn + nodplc[loc + 20];
- /*< value(locy)=value(locy)-gds-xnrm*(gm+gmbs)+gcdsb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] - gds - xnrm * (gm +
- gmbs) + gcdsb;
- /*< locy=lvn+nodplc(loc+22) >*/
- locy = tabinf_1.lvn + nodplc[loc + 21];
- /*< value(locy)=value(locy)-(xnrm-xrev)*gm+gcsgb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] - (xnrm - xrev) * gm +
- gcsgb;
- /*< locy=lvn+nodplc(loc+23) >*/
- locy = tabinf_1.lvn + nodplc[loc + 22];
- /*< value(locy)=value(locy)-gspr >*/
- blank_1.value[locy - 1] -= gspr;
- /*< locy=lvn+nodplc(loc+24) >*/
- locy = tabinf_1.lvn + nodplc[loc + 23];
- /*< value(locy)=value(locy)-gbs-(xnrm-xrev)*gmbs- >*/
- /*< 1 gcsgb-gcsdb-gcssb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] - gbs - (xnrm - xrev) *
- gmbs - gcsgb - gcsdb - gcssb;
- /*< locy=lvn+nodplc(loc+25) >*/
- locy = tabinf_1.lvn + nodplc[loc + 24];
- /*< value(locy)=value(locy)-gds-xrev*(gm+gmbs)+gcsdb >*/
- blank_1.value[locy - 1] = blank_1.value[locy - 1] - gds - xrev * (gm +
- gmbs) + gcsdb;
- /*< 1000 loc=nodplc(loc) >*/
- L1000:
- loc = nodplc[loc - 1];
- /*< go to 10 >*/
- goto L10;
- /*< end >*/
- } /* mosfet_ */
-
- #undef qgs
- #undef qbs
- #undef gmo
- #undef qgb
- #undef qgd
- #undef qbd
- #undef cqg
- #undef cqd
- #undef cqb
- #undef cdo
- #undef vdsato
- #undef cvalue
- #undef nodplc
- #undef qg
- #undef qd
- #undef qb
- #undef gmbso
- #undef cgsbo
- #undef cbsbo
- #undef cggbo
- #undef cgdbo
- #undef cbgbo
- #undef cbdbo
- #undef vono
- #undef vdso
- #undef vgso
- #undef vbso
- #undef cqgs
- #undef cgso
- #undef gbso
- #undef gdso
- #undef vbdo
- #undef cqbs
- #undef cbso
- #undef cqgb
- #undef cqgd
- #undef cgdo
- #undef gbdo
- #undef cgbo
- #undef cqbd
- #undef cbdo
-
-
-